// 所有和权限控制相关的事儿
import router from './router'
import { getToken } from './utils/auth'
// import { getProfileAPI } from './api/user'
import store from './store'
import asyncRoutes from './router/asyncRoutes'

const WHITE_LIST = ['/login', '/404']

console.log('权限控制生效了')
// 获取一级路由权限标识
function getFirstRoutePermission(permission) {
  const firstPermArr = permission.map(item => {
    return item.split(':')[0]
  })
  // 去重
  return [...new Set(firstPermArr)]
}

// 获取二级路由权限标识
function getSecondRoutePermission(permission) {
  const secondPermArr = permission.map(item => {
    const arr = item.split(':')
    return `${arr[0]}:${arr[1]}`
  })
  return [...new Set(secondPermArr)]
}

// 根据一级权限标识和二级权限标识与动态路由匹配
function getRoutes(firstPermission, secondPermission, asyncRoutes) {
  if (firstPermission.includes('*')) {
    // 管理员
    return asyncRoutes
  }
  const firstRoutes = asyncRoutes.filter(item => {
    return firstPermission.includes(item.permission)
  })
  const routes = firstRoutes.map(item => {
    return {
      ...item,
      children: item.children.filter(child => {
        return secondPermission.includes(child.permission)
      })
    }
  })
  return routes
}

// 1. 路由前置守卫
// 注意: to，from参数位置代表的意义是固定的，第一个参数永远代表去往的路由对象，第二个参数永远代码从哪里来的路由对象
router.beforeEach(async(to, from, next) => {
  // from: 路由对象 从哪里来的那个对象
  // to: 目标路由对象 到哪里去
  // next: 放行函数
  const token = getToken()
  if (token) {
    // 有token
    if (to.path === '/login') {
      // 登录页
      next('/')
    } else {
      next()
      // 1. 获取用户权限信息
      const permission = await store.dispatch('menu/getUserPermission')
      // 2. 根据权限标识，筛选出对应的一级路由标识
      const firstPermission = getFirstRoutePermission(permission)
      console.log('一级路由标识', firstPermission)
      // 3. 根据权限标识，筛选出对应的二级路由标识
      const secondPermission = getSecondRoutePermission(permission)
      console.log('二级路由标识', secondPermission)
      // 4.根据一级权限标识和二级权限标识与动态路由匹配
      console.log('动态路由', asyncRoutes)
      const routes = getRoutes(firstPermission, secondPermission, asyncRoutes)
      console.log(70, routes)
      // 5. 展示匹配后的路由
      // 5.1 添加到路由对象中
      routes.forEach(item => router.addRoute(item))
      // 5.2 添加到vuex中
      store.commit('menu/setMenulist', routes)
    }
  } else {
    // 没token
    // 是否在白名单内 - 是否在数组中能找到 - path - to.path
    if (WHITE_LIST.includes(to.path)) {
      // 在白名单内
      next()
    } else {
      // 不在白名单内
      next('/login')
    }
  }
})
